class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(name+"在吃饭");
    }
}
class Dog extends Animal{
    public void wangwang(){
        System.out.println(name+"旺旺叫");
    }

    @Override
    public void eat() {
        System.out.println(name+"正在吃狗粮");
    }
}
class Cat extends Animal{
    public void miaomiao(){
        System.out.println(name+"喵喵叫");
    }
    @Override
    public void eat(){
        System.out.println(name+"正在吃猫粮");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();//向上转型，Animal 是 Dog的父类虽然类型不同，可以直接赋值
        animal1.name = "十一";
        animal1.eat();
        //animal1.wangwang();向上转型后，无法通过animal1引用访问子类成员，只能访问自己类里的成员

        System.out.println("================");
        Animal animal2 = new Cat();//向上转型，Animal 是 Dog的父类虽然类型不同，可以直接赋值
        animal2.name = "YY";
        animal2.eat();

    }
    public static void func(Animal animal){//方法二：传参向上转型

    }
    public static Animal func2(){//方法三：返回值向上转型
        return new Dog();
    }
    public static void main2(String[] args) {
        Dog dog = new Dog();
        func(dog);
    }
    public static void main1(String[] args) {//方法一：直接赋值向上转型
       Animal animal1 = new Dog();//向上转型，Animal 是 Dog的父类虽然类型不同，可以直接赋值
       animal1.name = "十一";
       animal1.eat();
       //animal1.wangwang();向上转型后，无法通过animal1引用访问子类成员，只能访问自己类里的成员

        System.out.println("================");
        Animal animal2 = new Cat();//向上转型，Animal 是 Dog的父类虽然类型不同，可以直接赋值
        animal2.name = "YY";
        animal2.eat();
    }
    
}
